-- 2022-7-27

---[[
    -- 表构造器是用来创建和初始化表的表达式，也是Lua语言独有的也是最有用，最灵活的机制之一

    -- 最简单的构造器是空构造器{}
    x = {}

    -- 也可以用来初始化列表 列表式
    days = {"a","b","c"}
    print(days[1]) --> a
    print(days[2]) --> b
    print(days[3]) --> c

    -- Lua语言还提供了以初始化记录式表的特殊语法 记录式
    A = {x = 10 , y = 20}
    -- 等价于
    a = {}; a.x = 10; a.y = 20
    -- 第一种写法中，由于能够提前判断表的大小，所以运行速度更快

    -- 无论使用哪种方式都可以增加删除表，不过，使用合适的构造器来创建表会更加高效和易读

    -- 还可以混用起到不一样的效果
    w = {x = 0,y = 0}
    x = {1,2,3}
    w.f = x
    print(w.f) --> 得到的是x，不是简单的字符x，而是变量，也就是上面的x table的地址
    print(x)
    print(w.f[1]) --> 这里 w.f 等价于 x变量

    print("----------")

    w = {f = "x",y = 0}
    x = {1,2,3}
    print(w.f) --> 得到的是x字符
    print(x) --> 得到的是地址
    print(w.f[1]) --> 这里 w.f 为 x字符
    -- w.f = x
    print(w.f[1]) --> 这里 w.f 等价于 x变量
--]]

---[[
    -- 在同一个构造器中可以混用记录式和列表式
    a = {
        age = 10,
        color = "green",
        {x = 1,y = 1},
        {x = 2,y = 2},
        {x = 3,y = 3,{z = 4,w = 4}}
    }
    print(a.age)
    print(a[1].x)
    print(a[2].y)
    print(a[3][1].w)

    -- 上述也展示了如何创建嵌套表，我们可以根据自己的需求来创建不同的表，也可以进行多次嵌套

    -- 不过这两种也有自己的局限
    -- 例如，我们的索引只能从1开始，不能是负数或其他值
    -- 也不能使用不合规范的标识符作为索引
    -- b = {+ = "add"} -- 这是错误的，会报错
    -- c = {-1 = "--"} -- 这是错误的，会报错
    -- 对于这类需求，可以使用方括号括起来的表达式显示的指定每一个索引
    b = {["+"] = "add",[-1] = "-1"}
    print(b[-1])
    print(b["+"])

    -- 也可以这样
    i = 20
    s = "-"
    c = {[i+0] = s,[i+1] = s..s,[i+2] = s..s..s}
    print(c[22])

    -- 这种构造器虽然比较长，但却非常灵活，，不管是构造式还是记录式均是其特殊形式
    -- 在最后一个元素后面可以选择是否加逗号
    -- 也可以使用分号代替逗号，但这是为了兼容旧版本设置的
--]]